#include <iostream>
#include <chrono>
#include <sw/redis++/redis++.h>
#include <thread>
#include "util.hpp"
using namespace std;
void test1(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "1", 10s);
    auto value = redis.get("key");
    long long time = redis.ttl("key");
    this_thread::sleep_for(2s);
    if (value)
    {
        cout << "key:" << value.value() << " ttl:" << time << endl;
    }
}
void test2(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    redis.set("key", "111", 0s, sw::redis::UpdateType::NOT_EXIST);
    auto value1 = redis.get("key");
    if (value1)
    {
        cout << "value1:" << value1.value() << endl;
    }
    else
    {
        cout << "key 不存在" << endl;
    }
    redis.set("key", "222", 0s, sw::redis::UpdateType::EXIST);
    auto value2 = redis.get("key");
    if (value2)
    {
        cout << "value2:" << value2.value() << endl;
    }
    else
    {
        cout << "key 不存在" << endl;
    }
}

void test3(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.mset({make_pair<string, string>("key1", "111"), make_pair<string, string>("key2", "222"),
                make_pair<string, string>("key3", "333"), make_pair<string, string>("key4", "444")});

    vector<sw::redis::OptionalString> container;
    auto it = back_inserter(container);
    redis.mget({"key1", "key2", "key3", "key4", "key5"}, it);
    PrintContainer(container);
}
void test4(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "abcdefjhk");
    string result = redis.getrange("key", 2, 4);
    cout << "reslut : " << result << endl;
    redis.setrange("key", 2, "xyz");
    auto value = redis.get("key");
    if (value)
    {
        cout << "value : " << value.value() << endl;
    }
}
void test5(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "100");
    long long value = redis.incr("key");
    cout << "value:" << value << endl;
    value = redis.decr("key");
    cout << "value:" << value << endl;
}
void test6(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.lpush("key", "1");
    redis.lpush("key", {"2", "3", "4"});
    vector<string> v({"5", "6", "7"});
    redis.lpush("key", v.begin(), v.end());
    vector<string> containter;
    auto it = back_inserter(containter);
    redis.lrange("key", 0, -1, it);
    PrintContainer(containter);
}
void test7(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.rpush("key", "1");
    redis.rpush("key", {"2", "3", "4"});
    vector<string> container;
    auto it = back_inserter(container);
    redis.lrange("key", 0, -1, it);
    PrintContainer(container);
    auto value = redis.rpop("key");
    if (value)
    {
        cout << "value:" << value.value() << endl;
    }
}
void test8(sw::redis::Redis &redis)
{
    redis.flushall();
    sw::redis::OptionalStringPair it = redis.blpop("key");
    if (it)
    {
        cout << "key:" << it->first << endl;
        cout << "value:" << it->second << endl;
    }
}
int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test8(redis);

    return 0;
}